package util;

public class StringUtil { // 字符串处理工具 完成人：姜凯严 7/3
    
    /**
     * 字符串截断工具方法
     * @param str 原始字符串
     * @param maxLength 最大长度
     * @return 截断后的字符串，如果超长则添加".."后缀
     */
    public static String truncateString(String str, int maxLength) {
        if (str == null) {
            return "";
        }
        if (str.length() <= maxLength) {
            return str;
        }
        return str.substring(0, maxLength - 2) + "..";
    }
    
    /**
     * 计算字符串的显示宽度（考虑中文字符占2个字符宽度）
     * @param str 字符串
     * @return 显示宽度
     */
    public static int getDisplayWidth(String str) {
        if (str == null) {
            return 0;
        }
        int width = 0;
        for (char c : str.toCharArray()) {
            // 中文字符、全角字符等占2个字符宽度
            if (isCjkCharacter(c)) {
                width += 2;
            } else {
                width += 1;
            }
        }
        return width;
    }
    
    /**
     * 判断是否为CJK字符（中日韩字符）
     * @param c 字符
     * @return 是否为CJK字符
     */
    private static boolean isCjkCharacter(char c) {
        // Unicode范围：
        // 中文: 0x4E00-0x9FFF
        // 日文假名: 0x3040-0x309F, 0x30A0-0x30FF
        // 韩文: 0xAC00-0xD7AF
        // 全角符号: 0xFF00-0xFFEF
        return (c >= 0x4E00 && c <= 0x9FFF) ||
               (c >= 0x3040 && c <= 0x309F) ||
               (c >= 0x30A0 && c <= 0x30FF) ||
               (c >= 0xAC00 && c <= 0xD7AF) ||
               (c >= 0xFF00 && c <= 0xFFEF);
    }
    
    /**
     * 根据显示宽度截断字符串，确保表格对齐
     * @param str 原始字符串
     * @param maxDisplayWidth 最大显示宽度
     * @return 截断后的字符串
     */
    public static String truncateByDisplayWidth(String str, int maxDisplayWidth) {
        if (str == null) {
            return "";
        }
        
        if (getDisplayWidth(str) <= maxDisplayWidth) {
            return str;
        }
        
        StringBuilder result = new StringBuilder();
        int currentWidth = 0;
        
        for (char c : str.toCharArray()) {
            int charWidth = isCjkCharacter(c) ? 2 : 1;
            
            // 如果加上当前字符会超出宽度限制，且还有空间放省略号
            if (currentWidth + charWidth > maxDisplayWidth - 2) {
                result.append("..");
                break;
            }
            
            result.append(c);
            currentWidth += charWidth;
        }
        
        return result.toString();
    }
    
    /**
     * 填充字符串到指定显示宽度，确保表格对齐
     * @param str 原始字符串
     * @param targetDisplayWidth 目标显示宽度
     * @return 填充后的字符串
     */
    public static String padToDisplayWidth(String str, int targetDisplayWidth) {
        if (str == null) {
            str = "";
        }
        
        int currentWidth = getDisplayWidth(str);
        if (currentWidth >= targetDisplayWidth) {
            return str;
        }
        
        // 用空格填充到目标宽度
        StringBuilder result = new StringBuilder(str);
        for (int i = currentWidth; i < targetDisplayWidth; i++) {
            result.append(" ");
        }
        
        return result.toString();
    }
    
    /**
     * 检查字符串是否为空或null
     * @param str 要检查的字符串
     * @return 如果为空或null返回true，否则返回false
     */
    public static boolean isEmpty(String str) {
        return str == null || str.trim().isEmpty();
    }
    
    /**
     * 安全获取字符串，避免null
     * @param str 原始字符串
     * @param defaultValue 默认值
     * @return 如果原始字符串为null则返回默认值，否则返回原始字符串
     */
    public static String safeString(String str, String defaultValue) {
        return str != null ? str : defaultValue;
    }
    
    /**
     * 安全获取字符串，null时返回空字符串
     * @param str 原始字符串
     * @return 如果原始字符串为null则返回空字符串，否则返回原始字符串
     */
    public static String safeString(String str) {
        return safeString(str, "");
    }
}
